<!doctype html>



  


<html class="theme-next mist use-motion">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>



<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />












  
  
  <link href="/vendors/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  

  

  

  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/vendors/font-awesome/css/font-awesome.min.css?v=4.4.0" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.0.1" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="SQL," />








  <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.0.1" />






<meta name="description" content="说明：SQL基本知识：SQL组成、SQL示例等。">
<meta name="keywords" content="SQL">
<meta property="og:type" content="article">
<meta property="og:title" content="SQL基本知识">
<meta property="og:url" content="http://bebetter.site/2017/09/01/Database/SQL-basic/SQL基本知识/index.html">
<meta property="og:site_name" content="gatewayzy">
<meta property="og:description" content="说明：SQL基本知识：SQL组成、SQL示例等。">
<meta property="og:updated_time" content="2017-09-01T05:58:10.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="SQL基本知识">
<meta name="twitter:description" content="说明：SQL基本知识：SQL组成、SQL示例等。">



<script type="text/javascript" id="hexo.configuration">
  var NexT = window.NexT || {};
  var CONFIG = {
    scheme: 'Mist',
    sidebar: {"position":"right","display":"always"},
    fancybox: true,
    motion: true,
    duoshuo: {
      userId: 0,
      author: '博主'
    }
  };
</script>




  <link rel="canonical" href="http://bebetter.site/2017/09/01/Database/SQL-basic/SQL基本知识/"/>

  <title> SQL基本知识 | gatewayzy </title>
</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  










  
  
    
  

  <div class="container one-collumn sidebar-position-right page-post-detail ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-meta ">
  

  <div class="custom-logo-site-title">
    <a href="/"  class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <span class="site-title">gatewayzy</span>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>
  <p class="site-subtitle">blog of gatewayzy</p>
</div>

<div class="site-nav-toggle">
  <button>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
  </button>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />
            
            关于
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      

      
    </ul>
  

  
</nav>

 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                SQL基本知识
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2017-09-01T13:58:10+08:00" content="2017-09-01">
              2017-09-01
            </time>
          </span>

          
            <span class="post-category" >
              &nbsp; | &nbsp;
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="https://schema.org/Thing">
                  <a href="/categories/Database/" itemprop="url" rel="index">
                    <span itemprop="name">Database</span>
                  </a>
                </span>

                
                

              
            </span>
          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        <p><strong>说明：</strong>SQL基本知识：SQL组成、SQL示例等。<br><a id="more"></a></p>
<h2 id="SQL组成"><a href="#SQL组成" class="headerlink" title="SQL组成"></a>SQL组成</h2><h2 id="范式"><a href="#范式" class="headerlink" title="范式"></a>范式</h2><h2 id="事务"><a href="#事务" class="headerlink" title="事务"></a>事务</h2><ul>
<li>数据库的事务，事务的含义？一组相互依赖的操作行为，只要有一个操作行为失败，则整个事务失败。流程为：开始事务、执行crud语句、执行成功则提交事务否则撤销事务进行回滚。</li>
<li><strong>事务的ACID四个基本要素</strong>？数据库事务正确执行的四个基本要素的缩写：<ul>
<li>原子性  整个事务中的所有操作，要么全部完成，要么全部不完成进行回滚</li>
<li>一致性  事务必须始终保持系统处于一致的状态，不管在任何给定的时间并发事务有多少</li>
<li>隔离性  隔离状态执行事务，使它们好像是系统在给定时间内执行的唯一操作</li>
<li>持久性 Durability [ˌdjʊrəˈbɪlətɪ]  在事务完成以后，该事务对数据库所作的更改便持久的保存在数据库之中，并不会被回滚</li>
</ul>
</li>
<li><strong>事务的隔离级别</strong>？为了兼顾并发效率和异常控制，在标准SQL规范中，定义了4个事务隔离级别<ul>
<li>Read uncommitted 读未提交：允许一个更新语句没有提交,但是别的事务可以读到这个改变。最低隔离级别，不安全。可能出现<strong>脏读、不可重复读、幻像读(幻读/虚读)</strong> <em>脏读：事务1中将10变成20，但是未提交事务，事务2读到20，但是事务1之后事务提交发生错误并进行回滚，事务2的20就是脏读。</em></li>
<li>Read committed 读提交：只能读取到执行commit之后的数据。Sql Server，Oracle等多数数据库默认都是该级别。可能出现<strong>不可重复读、幻像读</strong>  <em>不可重复读是指在对于数据库中的某个数据，一个事务范围内多次查询却返回了不同的数据值，这是由于在查询间隔，被另一个事务修改并提交了。比如，事务1读取10，事务2读取10并修改为20并正确提交事务，事务1再读就是20，10就是不可重复读</em>。不可重复读和脏读的区别是，脏读是某一事务读取了另一个事务未提交的脏数据，而不可重复读则是读取了前一事务提交的数据。</li>
<li>Repeatable read 重复读：在同一个事务里面先后执行同一个查询语句的时候,得到的结果是一样的。MySQL的默认隔离级别。可能出现<strong>幻像读</strong>  <em>幻象读：事务1读取所有用户，事务2插入或删除一个用户并提交了事务，事务1再次读取所有用户与之前不一样</em></li>
<li>Serializable 序列化：事务顺序执行，不允许事务并行。最高隔离级别，代价也最高，性能低，很少用。避免脏读、不可重复读、幻像读</li>
</ul>
</li>
</ul>
<h2 id="锁"><a href="#锁" class="headerlink" title="锁"></a>锁</h2><ul>
<li><p>数据库锁、并发锁？</p>
<ul>
<li>数据库系统采用锁机制来实现事务的隔离性。各数据库采用的锁的理论基本上是一致的，只是具体实现有所不同。</li>
<li>按照封装程度，锁分为：共享锁、独占锁和更新锁。</li>
<li>1、共享锁  <ul>
<li>共享锁用于读数据操作，它是非独占的，允许其他事务同时读取锁定的资源，但不允许其他事务更新它。</li>
<li>加锁条件：当一个事务执行select语句时，数据库系统会为这个事务分配一把共享锁，来锁定被查询的数据。</li>
<li>解锁条件：默认情况下，数据被读取后，数据库系统立即解除共享锁。</li>
<li>兼容性：如果数据资源上放置了共享锁，还能再放置共享锁和更新锁。</li>
</ul>
</li>
<li>2、独占锁<ul>
<li>独占锁也叫排他锁，使用于修改数据的场合。它锁定的资源，其他事务不能读取也不能修改。</li>
<li>加锁条件：当一个事务执行insert、update或delete语句是，数据库会放置一把排他锁。</li>
<li>解锁条件：独占锁一直到事务结束才能被解除。</li>
<li>兼容性：不能与其他锁兼容。</li>
</ul>
</li>
<li><p>3、更新锁</p>
<ul>
<li>加锁条件：在更新操作的初始化阶段来锁定可能要修改的资源，这可避免使用共享锁造成的死锁现象。</li>
<li>兼容条件：更新锁与共享锁是兼容的</li>
</ul>
</li>
<li><p>下面以一条update语句执行过程为例阐述一下更新锁的作用：update account set balance = 1000 where id = 10;</p>
</li>
<li>使用共享锁，更新数据操作分两步：<br>  1、获得一个共享锁，读取account表中id为10的记录<br>  2、将共享锁升级为独占锁，再执行更新操作<br>  此种情况下，很容易产生死锁问题。</li>
<li><p>使用更新锁，更新数据的操作分两步：<br>  1、获得一个更新锁，读取account表中id为10的记录<br>  2、将共享锁升级为独占锁，再执行更新操作</p>
</li>
<li><p>我们在编写应用程序时，也会用到锁，这就是所谓的悲观锁和乐观锁</p>
<ul>
<li>乐观锁：完全依靠数据库的事务隔离级别来自动管理锁的工作</li>
<li>悲观锁：悲观锁对事态很悲观，当事务访问数据资源时，先要锁定资源</li>
</ul>
</li>
<li>Oracle、SqlServer和Mysql都支持select … from update这样的语句，以上语句显示指定独占锁来锁定查询的记录。执行该条查询语句的事务持有这把锁，直到事务结束才会释放锁。</li>
</ul>
</li>
</ul>
<h2 id="主从备份"><a href="#主从备份" class="headerlink" title="主从备份"></a>主从备份</h2><ul>
<li>数据库主从备份？<ul>
<li>对于一个mysql服务器，一般有两个线程来负责复制和被复制。当开启复制之后。</li>
<li><ol>
<li>作为主服务器Master，会把自己的每一次改动都记录到二进制日志 Binarylog 中。（从服务器会负责来读取这个log， 然后在自己那里再执行一遍）</li>
</ol>
</li>
<li><ol>
<li>作为从服务器Slave，会用master上的账号登陆到 master上，读取master的Binarylog, 写入到自己的中继日志 Relaylog，然后自己的sql线程会负责读取这个中继日志，并执行一遍。通过执行相同的sql语句实现主从一致性。</li>
</ol>
</li>
</ul>
</li>
</ul>
<h2 id="索引"><a href="#索引" class="headerlink" title="索引"></a>索引</h2><ul>
<li>索引类型分为Primary key主键索引、Unique索引、Normal普通索引、Fulltext全文索引。</li>
<li>索引方法有btree和hash两种索引方法。</li>
<li>创建索引可以使用alter table和create index的方式。</li>
</ul>
<h3 id="alter-table"><a href="#alter-table" class="headerlink" title="alter table"></a>alter table</h3><ol>
<li>PRIMARY  KEY（主键索引）<br>mysql&gt;ALTER  TABLE  <code>table_name</code>  ADD  PRIMARY  KEY (  <code>column</code>  ) </li>
<li>UNIQUE(唯一索引)<br>mysql&gt;ALTER  TABLE  <code>table_name</code>  ADD  UNIQUE (<code>column</code> ) </li>
<li>INDEX(普通索引)<br>mysql&gt;ALTER  TABLE  <code>table_name</code>  ADD  INDEX index_name (  <code>column</code>  )</li>
<li>FULLTEXT(全文索引)<br>mysql&gt;ALTER  TABLE  <code>table_name</code>  ADD  FULLTEXT ( <code>column</code> )</li>
<li>多列索引<br>mysql&gt;ALTER  TABLE  <code>table_name</code>  ADD  INDEX index_name (  <code>column1</code>,  <code>column2</code>,  <code>column3</code>  )</li>
</ol>
<ul>
<li>举例：ALTER  TABLE  users  ADD  INDEX index1 (userid desc,  username asc)，将会添加index1对id和name进行Normal联合索引，默认使用BTREE索引（而不是HASH）</li>
</ul>
<h3 id="create-index"><a href="#create-index" class="headerlink" title="create index"></a>create index</h3><p>类似于alter的类型：<br>CREATE INDEX index_name ON <code>table_name</code> (<code>column_list</code>)<br>CREATE UNIQUE INDEX index_name ON <code>table_name</code> (<code>column_list</code>)</p>
<h3 id="查看索引"><a href="#查看索引" class="headerlink" title="查看索引"></a>查看索引</h3><p>show index from tblname; 或者<br>show keys from tblname;</p>
<h3 id="删除索引"><a href="#删除索引" class="headerlink" title="删除索引"></a>删除索引</h3><p>ALTER TABLE <code>table_name</code> DROP INDEX <code>index_name</code><br>删除主键索引也可以： ALTER TABLE table_name DROP PRIMARY KEY</p>
<h2 id="存储过程"><a href="#存储过程" class="headerlink" title="存储过程"></a>存储过程</h2><h3 id="创建存储过程"><a href="#创建存储过程" class="headerlink" title="创建存储过程"></a>创建存储过程</h3><ol>
<li>一般自定义的变量使用’@’符号开头，如 set @name=’test’。</li>
<li>存储过程中的分号是必须的，begin、end等不需要分号。</li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">CREATE PROCEDURE proc1(IN name1 CHAR(20))   /*IN 表示输入参数，char限定类型*/</div><div class="line">BEGIN </div><div class="line">	IF name1 is null or name1=&apos;&apos; THEN </div><div class="line">		SELECT * FROM users; </div><div class="line">	ELSE </div><div class="line">		SELECT * FROM users WHERE username LIKE CONCAT(&apos;%&apos;,name1,&apos;%&apos;);</div><div class="line">	END IF; </div><div class="line">END</div></pre></td></tr></table></figure>
<h3 id="调用存储过程"><a href="#调用存储过程" class="headerlink" title="调用存储过程"></a>调用存储过程</h3><ol>
<li>基本语法：call proc1(‘qq’)，注意：存储过程名称后面必须加括号，哪怕该存储过程没有参数传递</li>
</ol>
<h3 id="删除存储过程"><a href="#删除存储过程" class="headerlink" title="删除存储过程"></a>删除存储过程</h3><ol>
<li><p>基本语法：drop procedure proc1</p>
</li>
<li><p>注意事项: 不能在一个存储过程中删除另一个存储过程，只能调用另一个存储过程</p>
</li>
</ol>
<h3 id="其他常用命令"><a href="#其他常用命令" class="headerlink" title="其他常用命令"></a>其他常用命令</h3><ol>
<li>show procedure status  显示数据库中所有存储的存储过程基本信息，包括所属数据库，存储过程名称，创建时间等</li>
<li>show create procedure proc1  显示某一个MySQL存储过程的详细信息</li>
</ol>
<h3 id="存储过程-遍历所有表的字段"><a href="#存储过程-遍历所有表的字段" class="headerlink" title="存储过程-遍历所有表的字段"></a>存储过程-遍历所有表的字段</h3><ul>
<li>功能：将整个数据库中，值为’NULL’的字段全部置为null。</li>
<li>思路：<ul>
<li>先从MySQL的information_schema数据库中的COLUMNS表中，选取出目标数据库的所有表和字段到tmp表中。</li>
<li>然后使用存储过程，遍历tmp表，进行update操作。</li>
</ul>
</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"># 先创建一个带输入参数的存储过程，用于更新指定的表和字段。</div><div class="line"># 注意这里使用参数值作为表/列名的方法，直接使用变量名会以变量名为表/列名。</div><div class="line">create PROCEDURE proc(in tab VARCHAR(50), in col VARCHAR(50))</div><div class="line">BEGIN</div><div class="line"></div><div class="line">set @t=CONCAT(&apos;update &apos;,tab,&apos; set &apos;, col, &apos;=null where &apos;, col, &apos; =&quot;NULL&quot;&apos;);</div><div class="line">PREPARE statement1 from @t;</div><div class="line">EXECUTE statement1;</div><div class="line">DEALLOCATE PREPARE statement1;</div><div class="line"></div><div class="line">commit;</div><div class="line">end</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line"># 然后创建一个存储过程，使用游标进行遍历，调用上一个proc进行处理。</div><div class="line">create PROCEDURE pro4()</div><div class="line">BEGIN</div><div class="line"></div><div class="line">DECLARE col VARCHAR(40);</div><div class="line">DECLARE tab VARCHAR(40);</div><div class="line"></div><div class="line">DECLARE done int DEFAULT FALSE;</div><div class="line"></div><div class="line">DECLARE mycursor CURSOR for (SELECT tabs,  cols FROM `tmp` where tabs=&apos;symsynmap&apos;);</div><div class="line">DECLARE CONTINUE HANDLER for not found SET done = true;</div><div class="line"></div><div class="line">open mycursor;</div><div class="line"></div><div class="line">myloop: LOOP</div><div class="line">	FETCH mycursor into tab,col;</div><div class="line">	if done THEN</div><div class="line">		LEAVE myloop;</div><div class="line">	end IF;</div><div class="line">	call proc(tab, col);</div><div class="line">	COMMIT;</div><div class="line">end LOOP myloop;</div><div class="line"></div><div class="line">CLOSE mycursor;</div><div class="line">END;</div></pre></td></tr></table></figure>
<h2 id="引擎"><a href="#引擎" class="headerlink" title="引擎"></a>引擎</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div></pre></td><td class="code"><pre><div class="line"> 数据库中的存储引擎其实是对使用了该引擎的表进行某种设置，数据库中的表设定了什么存储引擎，那么该表在数据存储方式、数据更新方式、数据查询性能以及是否支持索引等方面就会有不同的“效果”。在MySQL数据库中存在着多种引擎（不同版本的MySQL数据库支持的引擎不同），熟悉各种引擎才能在软件开发中应用引擎，从而开发出高性能的软件，MySQL数据库中的引擎有哪些呢？一般来说，MySQL有以下几种引擎：ISAM、MyISAM、HEAP（也称为MEMORY）、CSV、BLACKHOLE、ARCHIVE、PERFORMANCE_SCHEMA、InnoDB、 Berkeley、Merge、Federated和Cluster/NDB等，除此以外我们也可以参照MySQL++ API创建自己的数据库引擎。下面逐次介绍一下各种引擎：</div><div class="line">    </div><div class="line">ISAM</div><div class="line">该引擎在读取数据方面速度很快，而且不占用大量的内存和存储资源；但是ISAM不支持事务处理、不支持外来键、不能够容错、也不支持索引。该引擎在包括MySQL 5.1及其以上版本的数据库中不再支持。</div><div class="line">MyISAM</div><div class="line">该引擎基于ISAM数据库引擎，除了提供ISAM里所没有的索引和字段管理等大量功能，MyISAM还使用一种表格锁定的机制来优化多个并发的读写操作，但是需要经常运行OPTIMIZE TABLE命令，来恢复被更新机制所浪费的空间，否则碎片也会随之增加，最终影响数据访问性能。MyISAM还有一些有用的扩展，例如用来修复数据库文件的MyISAMChk工具和用来恢复浪费空间的 MyISAMPack工具。MyISAM强调了快速读取操作，主要用于高负载的select，这可能也是MySQL深受Web开发的主要原因：在Web开发中进行的大量数据操作都是读取操作，所以大多数虚拟主机提供商和Internet平台提供商（Internet Presence Provider，IPP）只允许使用MyISAM格式。</div><div class="line">MyISAM类型的表支持三种不同的存储结构：静态型、动态型、压缩型。</div><div class="line">静态型：指定义的表列的大小是固定（即不含有：xblob、xtext、varchar等长度可变的数据类型），这样MySQL就会自动使用静态MyISAM格式。使用静态格式的表的性能比较高，因为在维护和访问以预定格式存储数据时需要的开销很低；但这种高性能是以空间为代价换来的，因为在定义的时候是固定的，所以不管列中的值有多大，都会以最大值为准，占据了整个空间。</div><div class="line">动态型：如果列（即使只有一列）定义为动态的（xblob, xtext, varchar等数据类型），这时MyISAM就自动使用动态型，虽然动态型的表占用了比静态型表较少的空间，但带来了性能的降低，因为如果某个字段的内容发生改变则其位置很可能需要移动，这样就会导致碎片的产生，随着数据变化的增多，碎片也随之增加，数据访问性能会随之降低。</div><div class="line">对于因碎片增加而降低数据访问性这个问题，有两种解决办法：</div><div class="line">a、尽可能使用静态数据类型；</div><div class="line">b、经常使用optimize table table_name语句整理表的碎片，恢复由于表数据的更新和删除导致的空间丢失。如果存储引擎不支持 optimize table table_name则可以转储并        重新加载数据，这样也可以减少碎片；</div><div class="line">压缩型：如果在数据库中创建在整个生命周期内只读的表，则应该使用MyISAM的压缩型表来减少空间的占用。</div><div class="line">HEAP（也称为MEMORY）</div><div class="line">该存储引擎通过在内存中创建临时表来存储数据。每个基于该存储引擎的表实际对应一个磁盘文件，该文件的文件名和表名是相同的，类型为.frm。该磁盘文件只存储表的结构，而其数据存储在内存中，所以使用该种引擎的表拥有极高的插入、更新和查询效率。这种存储引擎默认使用哈希（HASH）索引，其速度比使用B-+Tree型要快，但也可以使用B树型索引。由于这种存储引擎所存储的数据保存在内存中，所以其保存的数据具有不稳定性，比如如果mysqld进程发生异常、重启或计算机关机等等都会造成这些数据的消失，所以这种存储引擎中的表的生命周期很短，一般只使用一次。</div><div class="line">CSV（Comma-Separated Values逗号分隔值）</div><div class="line">使用该引擎的MySQL数据库表会在MySQL安装目录data文件夹中的和该表所在数据库名相同的目录中生成一个.CSV文件（所以，它可以将CSV类型的文件当做表进行处理），这种文件是一种普通文本文件，每个数据行占用一个文本行。该种类型的存储引擎不支持索引，即使用该种类型的表没有主键列；另外也不允许表中的字段为null。</div><div class="line">BLACKHOLE（黑洞引擎）</div><div class="line">该存储引擎支持事务，而且支持mvcc的行级锁，写入这种引擎表中的任何数据都会消失，主要用于做日志记录或同步归档的中继存储，这个存储引擎除非有特别目的，否则不适合使用。详见博客《BlackHole 存储引擎》</div><div class="line">ARCHIVE</div><div class="line">该存储引擎非常适合存储大量独立的、作为历史记录的数据。区别于InnoDB和MyISAM这两种引擎，ARCHIVE提供了压缩功能，拥有高效的插入速度，但是这种引擎不支持索引，所以查询性能较差一些。</div><div class="line">PERFORMANCE_SCHEMA</div><div class="line">该引擎主要用于收集数据库服务器性能参数。这种引擎提供以下功能：提供进程等待的详细信息，包括锁、互斥变量、文件信息；保存历史的事件汇总信息，为提供MySQL服务器性能做出详细的判断；对于新增和删除监控事件点都非常容易，并可以随意改变mysql服务器的监控周期，例如（CYCLE、MICROSECOND）。</div><div class="line">InnoDB</div><div class="line">该存储引擎为MySQL表提供了ACID事务支持、系统崩溃修复能力和多版本并发控制（即MVCC Multi-Version Concurrency Control）的行级锁;该引擎支持自增长列（auto_increment）,自增长列的值不能为空，如果在使用的时候为空则自动从现有值开始增值，如果有但是比现在的还大，则直接保存这个值; 该引擎存储引擎支持外键（foreign key） ,外键所在的表称为子表而所依赖的表称为父表。该引擎在5.5后的MySQL数据库中为默认存储引擎。</div><div class="line">Berkeley（BDB）</div><div class="line">该存储引擎支持COMMIT和ROLLBACK等其他事务特性。该引擎在包括MySQL 5.1及其以上版本的数据库中不再支持。</div><div class="line">Merge</div><div class="line">该引擎将一定数量的MyISAM表联合而成一个整体。参见博客《MySQL Merge存储引擎》</div><div class="line">Federated</div><div class="line">该存储引擎可以不同的Mysql服务器联合起来，逻辑上组成一个完整的数据库。这种存储引擎非常适合数据库分布式应用。</div><div class="line">Cluster/NDB</div><div class="line">该存储引擎用于多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大、安全和性能要求高的场景。</div><div class="line">以上是对MySQL数据库中存储引擎的总结，只是重点总结了一下各种不同存储引擎的特点，不对的地方还望各位指正，不胜感激。</div></pre></td></tr></table></figure>
<ul>
<li>数据库的表的类型？InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型，这两个表类型各有优劣，视具体应用而定。基本的差别为：<ul>
<li>MyISAM类型不支持事务处理等高级处理，而InnoDB类型支持。</li>
<li>MyISAM类型的表强调的是性能，其执行数度比InnoDB类型更快，但是不提供事务支持，而InnoDB提供事务支持以及外部键等高级数据库功能。</li>
<li>两种类型最主要的差别就是InnoDB 支持事务处理、外键和行级锁。</li>
</ul>
</li>
</ul>

      
    </div>

    <div>
      
        

      
    </div>

    <div>
      
        

      
    </div>

    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/SQL/" rel="tag">#SQL</a>
          
        </div>
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2017/09/01/Database/SQL-advanced/索引优化/" rel="next" title="索引优化">
                <i class="fa fa-chevron-left"></i> 索引优化
              </a>
            
          </div>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2017/09/01/Database/SQL-basic/MYSQL使用/" rel="prev" title="MYSQL使用">
                MYSQL使用 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          
  <div class="comments" id="comments">
    


  </div>


        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview sidebar-panel ">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/statics/images/avatar.png"
               alt="gatewayzy" />
          <p class="site-author-name" itemprop="name">gatewayzy</p>
          <p class="site-description motion-element" itemprop="description">blog website with hexo and github pages</p>
        </div>
        <nav class="site-state motion-element">
          <div class="site-state-item site-state-posts">
            <a href="/archives">
              <span class="site-state-item-count">70</span>
              <span class="site-state-item-name">日志</span>
            </a>
          </div>

          
            <div class="site-state-item site-state-categories">
              <a href="/categories">
                <span class="site-state-item-count">10</span>
                <span class="site-state-item-name">分类</span>
              </a>
            </div>
          

          
            <div class="site-state-item site-state-tags">
              <a href="/tags">
                <span class="site-state-item-count">38</span>
                <span class="site-state-item-name">标签</span>
              </a>
            </div>
          

        </nav>

        

        <div class="links-of-author motion-element">
          
        </div>

        
        

        
        
          <div class="links-of-blogroll motion-element links-of-blogroll-inline">
            <div class="links-of-blogroll-title">
              <i class="fa  fa-fw fa-globe"></i>
              友情链接
            </div>
            <ul class="links-of-blogroll-list">
              
                <li class="links-of-blogroll-item">
                  <a href="https://github.com/gatewayzy" title="Github-gatewayzy" target="_blank">Github-gatewayzy</a>
                </li>
              
                <li class="links-of-blogroll-item">
                  <a href="http://google.com/" title="Goolge" target="_blank">Goolge</a>
                </li>
              
                <li class="links-of-blogroll-item">
                  <a href="http://wiki.jikexueyuan.com/" title="Wiki-jike" target="_blank">Wiki-jike</a>
                </li>
              
            </ul>
          </div>
        

      </section>

      
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">
            
              
            
            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#SQL组成"><span class="nav-number">1.</span> <span class="nav-text">SQL组成</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#范式"><span class="nav-number">2.</span> <span class="nav-text">范式</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#事务"><span class="nav-number">3.</span> <span class="nav-text">事务</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#锁"><span class="nav-number">4.</span> <span class="nav-text">锁</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#主从备份"><span class="nav-number">5.</span> <span class="nav-text">主从备份</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#索引"><span class="nav-number">6.</span> <span class="nav-text">索引</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#alter-table"><span class="nav-number">6.1.</span> <span class="nav-text">alter table</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#create-index"><span class="nav-number">6.2.</span> <span class="nav-text">create index</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#查看索引"><span class="nav-number">6.3.</span> <span class="nav-text">查看索引</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#删除索引"><span class="nav-number">6.4.</span> <span class="nav-text">删除索引</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#存储过程"><span class="nav-number">7.</span> <span class="nav-text">存储过程</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#创建存储过程"><span class="nav-number">7.1.</span> <span class="nav-text">创建存储过程</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#调用存储过程"><span class="nav-number">7.2.</span> <span class="nav-text">调用存储过程</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#删除存储过程"><span class="nav-number">7.3.</span> <span class="nav-text">删除存储过程</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#其他常用命令"><span class="nav-number">7.4.</span> <span class="nav-text">其他常用命令</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#存储过程-遍历所有表的字段"><span class="nav-number">7.5.</span> <span class="nav-text">存储过程-遍历所有表的字段</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#引擎"><span class="nav-number">8.</span> <span class="nav-text">引擎</span></a></li></ol></div>
            
          </div>
        </section>
      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy; 
  <span itemprop="copyrightYear">2018</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">gatewayzy</span>
</div>

<div class="powered-by">
  由 <a class="theme-link" href="https://hexo.io">Hexo</a> 强力驱动
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Mist
  </a>
</div>

        

        
      </div>
    </footer>

    <div class="back-to-top">
      <i class="fa fa-arrow-up"></i>
    </div>
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  



  
  <script type="text/javascript" src="/vendors/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/vendors/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/vendors/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/vendors/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/vendors/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/vendors/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.0.1"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.0.1"></script>



  
  

  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.0.1"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.0.1"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.0.1"></script>



  



  




  
  

  
  <script type="text/x-mathjax-config">
    MathJax.Hub.Config({
      tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
        processEscapes: true,
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
      }
    });
  </script>

  <script type="text/x-mathjax-config">
    MathJax.Hub.Queue(function() {
      var all = MathJax.Hub.getAllJax(), i;
      for (i=0; i < all.length; i += 1) {
        all[i].SourceElement().parentNode.className += ' has-jax';
      }
    });
  </script>
  <script type="text/javascript" src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>



  

  
<script type="text/javascript" async src="//push.zhanzhang.baidu.com/push.js">
</script>


</body>
</html>
